サービスロールが原因で消せなくなってしまったAWS Batchコンピューティング環境を消してみた
こんにちはAWS事業本部のKyoです。
AWS Batchユーザのみなさま、以下のようなエラーに遭遇したことはないでしょうか?
INVALID - CLIENT_ERROR - User: batch.amazonaws.com is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::XXXXXXXXXXX:role/service-role/AWSBatchServiceRole
この状態になってしまうと、Batchのコンピューティング環境への操作ができなくなり、コンピューティング環境を消せない、という状態になります。
発生条件
Batchのコンピューティング環境は存在するが、紐付けられているサービスロール(デフォルトではAWSBatchServiceRole
)が存在しない状態で環境に対して無効化や削除などの操作を行うと発生します。
私が経験したのは、以下のような流れでした。
- CloudFormationでサービスロールを含むIAM, Batchを別スタックとして構築
- それぞれのスタックを削除
- IAMは正常に削除された
- Batchのコンピューティング環境がなんらかの理由で残ってしまった
検証にあたっては、マネジメントコンソールからサービスロールを削除することで再現させています。
解決方法
解決方法はシンプルで、本来あるべきサービスロールを作成することです。
ここで、1つポイントがあります。
マネジメントコンソール経由でサービスロールを作成しようとすると、ロールのパスが/
になります。
通常サービスロールは/service-role/
以下に存在します。これはARNにも影響します。
AWSBatchServiceRole
のARNは本来以下のようになるはずです。
arn:aws:iam::<AWS ACCOUNT ID>:role/service-role/AWSBatchServiceRole
一方、マネジメントコンソール経由で作成すると以下のようになります。
arn:aws:iam::<AWS ACCOUNT ID>:role/AWSBatchServiceRole
これを防ぐために、パスを指定した状態でサービスロールを作成するには以下の2つの方法があります。
- CloudFormation
- AWS CLI
今回はCloudFormationで作成してみました。
以下のテンプレートを実行すると/service-role/
以下にAWSBatchServiceRole
が作成されます。
AWSBatchServiceRole
という名前のIAMロールを作成し、AWSBatchServiceRole
というAWS管理のIAMポリシーを付与しているだけです(ポリシーの名前もRoleとなっているのが若干混乱しますね。。)。
ポリシーの詳細はこのドキュメントにまとまっています。
AWSTemplateFormatVersion: 2010-09-09 Resources: AWSBatchServiceRole: Type: 'AWS::IAM::Role' Properties: RoleName: AWSBatchServiceRole AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: - 'batch.amazonaws.com' Action: - 'sts:AssumeRole' Path: /service-role/ ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSBatchServiceRole
これで、コンピューティング環境の削除を行えるようになりました。
※ サービスロールを作成しても、コンピューティング環境に操作を行わない限りはエラーの状態で表示されます。
コンピューティング環境の削除後、サービスロールが不要な場合はスタックも削除してください。
おわりに
今回はサービスロールが存在しないことで、消せなくなってしまったBatchのコンピューティング環境を削除しました。
おそらくレアなケースで、実害もそこまで大きくないものの、環境を削除できない状態はモヤモヤしてしまうものです。もしモヤモヤを抱えている場合は上記の方法をお試しいただければと思います。
以上何かのお役に立てれば幸いです。